/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.entity.utilisateur;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import net.etrs.formathlon.entity.formation.Formation;
import net.etrs.formathlon.entity.formation.Inscription;
import net.etrs.formathlon.entity.formation.Participation;
import net.etrs.formathlon.entity.formation.Session;
import net.etrs.formathlon.entity.utils.ComparableEvenThoughUnpersisted;
import net.etrs.formathlon.persistance.utils.JpaRequestNames;
import org.apache.commons.lang.WordUtils;

/**
 * Entité représentant un personnel qui va participer à une formation.
 * Un personnel ne peut exister sans un utilisateur.
 * Les informtations seront recherchées dans le LDAP.
 * @author OPIF
 */
@NamedQueries({
    @NamedQuery(name = JpaRequestNames.NB_PERSONNELS,
    query = "SELECT count(p) FROM Personnel p")
})
@Entity
public class Personnel extends ComparableEvenThoughUnpersisted<Personnel> {

    private static final long serialVersionUID = 1L;
    /**
     * Identifiant.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    /**
     * Nom du personnel.
     */
    private String nom = "";
    /**
     * Prénom du personnel.
     */
    private String prenom = "";
    /**
     * Grade du personnel.
     */
    private String grade = "";
    /**
     * Identifiant de l'utilisateur correspondant
     * On l'utilise pour la modification car on passe par
     * l'utilisateur pour modifier la personne.
     */
    @OneToOne(fetch = FetchType.LAZY, mappedBy = "personnel")
    private Utilisateur utilisateur = null;
    /**
     * Liste des inscriptions de la personne.
     */
    @OneToMany(mappedBy = "personnel")
    private List<Inscription> listInscription;
    /**
     * Information technique pour ne pas supprimer une personne.
     */
    private boolean archive = false;
    /****************FORMATEUR AVANCE*******************/
    /**
     * La liste sera vide pour un formateur normal.
     * Le formateur avancé aura une liste de spécialités.
     */
    @ManyToMany(mappedBy = "listInstructeur", fetch = FetchType.EAGER)
    private List<Formation> listSpecialite = new ArrayList<Formation>();
    /**
     * Un formateur avancé a la possibilité de dispenser une liste de sessions.
     */
    @OneToMany(mappedBy = "instructeur", cascade = CascadeType.ALL)
    private List<Session> listSessionDispensee = new ArrayList<Session>();
    
    /**
     * Liste des participants symbolisant le parcours pédagogique.
     */
    @OneToMany(mappedBy = "personnel")
    private List<Participation> parcoursPeda = new ArrayList<Participation>();

    @Override
    public Long getId() {
        return id;
    }

    /**
     * Setter de l'id.
     * @param id 
     */
    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return String.format("%s %s %s", grade, nom, prenom);
    }

    /**
     * Getter de l'utilisateur.
     * @return L'utilisateur
     */
    public Utilisateur getUtilisateur() {
        return utilisateur;
    }

    /**
     * Setter de l'utilisateur.
     * @param utilisateur L'utilisateur
     */
    public void setUtilisateur(Utilisateur utilisateur) {
        this.utilisateur = utilisateur;
    }

    /**
     * @return the nom
     */
    public String getNom() {
        return nom;
    }

    /**
     * @param nom the nom to set
     */
    public void setNom(String nom) {
        this.nom = nom.toUpperCase();
    }

    /**
     * @return the prenom
     */
    public String getPrenom() {
        return prenom;
    }

    /**
     * @param prenom the prenom to set
     */
    public void setPrenom(String prenom) {
        this.prenom = WordUtils.capitalizeFully(prenom, (" -").toCharArray());
    }

    /**
     * @return the grade
     */
    public String getGrade() {
        return grade;
    }

    /**
     * @param grade the grade to set
     */
    public void setGrade(String grade) {
        this.grade = grade.toUpperCase();
    }

    /**
     * @return the listSpecialite
     */
    public List<Formation> getListSpecialite() {
        return listSpecialite;
    }

    /**
     * @param listSpecialite the listSpecialite to set
     */
    public void setListSpecialite(List<Formation> listSpecialite) {
        this.setListSpecialite(listSpecialite);
    }

    /**
     * @return the listSessionDispensee
     */
    public List<Session> getListSessionDispensee() {
        return listSessionDispensee;
    }

    /**
     * @param listSessionDispensee the listSessionDispensee to set
     */
    public void setListSessionDispensee(List<Session> listSessionDispensee) {
        this.setListSessionDispensee(listSessionDispensee);
    }

    @Override
    public boolean isArchive() {
        return archive;
    }

    @Override
    public void setArchive(boolean archive) {
        this.archive = archive;
    }

    /**
     * @return the parcoursPeda
     */
    public List<Participation> getParcoursPeda() {
        return parcoursPeda;
    }

    /**
     * @param parcoursPeda the parcoursPeda to set
     */
    public void setParcoursPeda(List<Participation> parcoursPeda) {
        this.setParcoursPeda(parcoursPeda);
    }

    /**
     * Renvoie le nom dans le format NOM Prenom (GRADE).
     * @return Le nom complet
     */
    public String getNomComplet() {
        return String.format("%s %s (%s)", nom, prenom, grade);
    }

    /**
     * @return the listInscription
     */
    public List<Inscription> getListInscription() {
        return listInscription;
    }

    /**
     * @param listInscription the listInscription to set
     */
    public void setListInscription(List<Inscription> listInscription) {
        this.listInscription = listInscription;
    }
}
